#include "generate_random.h"


GenerateRandom::GenerateRandom():gen(rd())
{

}

// long和long long类型的区别
// long可能是4字节，也可能是8字节，在32位下是4字节，在64位下是8字节
// long long是8字节，无论32位系统还是64位系统
//推荐使用long long
//生成[min,max]的随机整数(整数最大为long long类型)
long long GenerateRandom::generate_num(long long min, long long max)
{
    // 创建随机数引擎，使用随机设备作为种子
    //std::random_device rd;  // 用于生成随机种子
    //std::mt19937 gen(rd()); // 使用Mersenne Twister算法的随机数引擎
    std::uniform_int_distribution<long long> distribution(min, max);
    long long num = distribution(gen); // 生成随机数
    return num;
}

//生成[min,max]的随机浮点数(float,和double类型)
double GenerateRandom::generate_double(double min, double max)
{
    // 创建随机数引擎，使用随机设备作为种子
    //std::random_device rd;  // 用于生成随机种子
    //std::mt19937 gen(rd()); // 使用Mersenne Twister算法的随机数引擎
    std::uniform_real_distribution<double> distribution(min, max);
    double double_num = distribution(gen); // 生成随机数
    return double_num;
}

//生成长度为length的随机字符串[A-Z,a-z,0-9]
string GenerateRandom::generate_string_of_length(int length)
{
    // 定义字符集，包括大写字母、小写字母和数字
    const std::string characters =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz"
        "0123456789";

    // 随机数引擎
    //std::random_device rd;  // 用于生成随机种子
    //std::mt19937 gen(rd()); // 使用 Mersenne Twister 算法的随机数引擎
    std::uniform_int_distribution<size_t> distribution(0, characters.size() - 1);

    std::string str;
    for (size_t i = 0; i < length; ++i)
    {
        // 从字符集中随机选择字符
        str += characters[distribution(gen)];
    }

    return str;
}

//生成[0.maxlength]随机长度的随机字符串
string GenerateRandom::generate_string(int maxlength)
{
    // 生成0到maxlength之间的随机长度
    //std::random_device rd;
    //std::mt19937 gen(rd());
    std::uniform_int_distribution<size_t> lengthDistribution(0, maxlength);

    // 获取随机长度
    size_t length = lengthDistribution(gen);
    std::string str = generate_string_of_length(length);
    return str;
}

